package utils

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"mime/multipart"
	"net/http"
	"net/url"
	"os"
	"path/filepath"
)

// TaoBaoIpResult 淘宝ip来源解析请求结果，结果示例：
//
//	{
//	   "data": {
//	       "area": "",
//	       "country": "中国",
//	       "isp_id": "1000114",
//	       "queryIp": "210.75.225.254",
//	       "city": "北京",
//	       "ip": "210.75.225.254",
//	       "isp": "科技网",
//	       "county": "",
//	       "region_id": "110000",
//	       "area_id": "",
//	       "county_id": null,
//	       "region": "北京",
//	       "country_id": "CN",
//	       "city_id": "110100"
//	   },
//	   "msg": "query success",
//	   "code": 0
//	}
type TaoBaoIpResult struct {
	Code int          `json:"code"`
	Msg  string       `json:"msg"`
	Data TaoBaoIpData `json:"data"`
}

type TaoBaoIpData struct {
	QueryIp string `json:"queryIp"`
	Ip      string `json:"ip"`

	//国家
	CountyId interface{} `json:"county_id"`
	County   string      `json:"county"`

	//
	CountryId string `json:"country_id"`
	Country   string `json:"country"`
	//区域
	AreaId string `json:"area_id"`
	Area   string `json:"area"`
	//如浙江
	RegionId string `json:"region_id"`
	Region   string `json:"region"`
	//城市，如：杭州
	CityId string `json:"city_id"`
	City   string `json:"city"`

	//运营商，如电信
	IspId string `json:"isp_id"`
	Isp   string `json:"isp"`
}

// ParseIpByTaoBao 解析ip来源（淘宝解析）
// 具体查看： https://ip.taobao.com/instructions
// 可能会有限流，使用时最好注意下sleep间隔
func ParseIpByTaoBao(ip string) (TaoBaoIpData, error) {

	//对应curl命令： curl -XPOST "https://ip.taobao.com/outGetIpInfo" -d "ip=122.224.148.218" -d "accessKey=alibaba-inc"
	data := url.Values{}
	data.Set("ip", ip)
	data.Set("accessKey", "alibaba-inc")

	resp, err := http.PostForm("https://ip.taobao.com/outGetIpInfo", data)
	if err != nil {
		return TaoBaoIpData{}, fmt.Errorf("reqeust err %s", err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)

	var ret TaoBaoIpResult
	json.Unmarshal(body, &ret)
	if ret.Code != 0 {
		return TaoBaoIpData{}, fmt.Errorf("request invalid err %+v", ret)
	}
	//fmt.Println(ip, " 查询成功", ret)
	return ret.Data, nil
}

func SetRequestBodyJson(req *http.Request, data interface{}) error {
	b, err := json.Marshal(data)
	if err != nil {
		return err
	}
	req.Body = io.NopCloser(bytes.NewReader(b))
	return nil
}

// SaveMultipartFile 保存文件
func SaveMultipartFile(header *multipart.FileHeader, uploadDir, fileName string) (string, error) {
	// 确保目标文件夹存在
	err := EnsureDir(uploadDir)
	if err != nil {
		return "", err
	}

	file, err := header.Open()
	if err != nil {
		return "", err
	}
	defer file.Close()

	// 创建目标文件
	dstPath := filepath.Join(uploadDir, fileName)
	dst, err := os.Create(dstPath)
	if err != nil {
		return "", err
	}
	defer dst.Close()

	// 将上传的文件内容复制到目标文件
	_, err = io.Copy(dst, file)
	if err != nil {
		return "", err
	}

	fullFileName := fileName + filepath.Ext(header.Filename)
	return fullFileName, nil
}

// CopyFile 复制文件，从src复制到dst
func CopyFile(src, dst string) error {
	// 打开源文件
	in, err := os.Open(src)
	if err != nil {
		return err
	}
	defer in.Close()

	// 创建目标文件
	out, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer out.Close()

	// 复制内容从src到dst
	_, err = io.Copy(out, in)
	return err
}
